home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
asm_msc1.arc
/
EX513.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-11-20
|
2KB
|
64 lines
TITLE Sort a Telephone List (EX513.ASM)
PAGE ,132
DATA SEGMENT PARA 'DATA'
SAVE_CNT DW ?
FIRST_ENT DW ?
DATA ENDS
OUR_CODE SEGMENT PARA 'CODE'
PUBLIC PHONE_NOS
PHONE_NOS PROC FAR
ASSUME CS:OUR_CODE,DS:DATA
PUSH AX ;Save scratch registers
PUSH BX
PUSH CX
PUSH BP
PUSH DI
PUSH SI
PUSH DS
;
; Initialize DS.
;
MOV AX,SEG DATA
MOV DS,AX
CLD ;Set DF = 0, to move forward
MOV CX,ES:[DI] ;Fetch entry count
MOV SAVE_CNT,CX ;Save this value in memory
ADD DI,2 ;Get address of first entry
MOV FIRST_ENT,DI ; and save this address
INIT: MOV BX,1 ;Exchange flag (BX) = 1
DEC SAVE_CNT ;Get ready for count-1 compares
JZ SORTED ;Exit if SAVE_CNT is 0
MOV CX,SAVE_CNT ;Load compare count into CX
MOV BP,FIRST_ENT ; and first entry addr. into BP
NEXT: MOV DI,BP ;Address one entry with DI
MOV SI,BP ; and the next entry with SI
ADD SI,42
PUSH CX ;Save current compare count
MOV CX,15 ;Compare 15-byte surnames
REPE CMPS ES:BYTE PTR[SI],ES:[DI]
;Is next surname < this surname?
JAE CONT ; No. Go check next pair
MOV CX,42 ; Yes. Exchange these entries
SWAPEM: MOV AL,ES:[BP]
XCHG ES:[BP+42],AL
MOV ES:[BP],AL
INC BP
LOOP SWAPEM
SUB BX,BX ;Set exchange flag = 0
CONT: POP CX ;Reload compare count
ADD BP,42 ;Point to next entry
LOOP NEXT ; and go compare next two names
CMP BX,0 ;Were any exchanges made?
JE INIT ; If so, make another pass
SORTED: POP DS
POP SI
POP DI
POP BP
POP CX
POP BX
POP AX
RET ; and exit.
PHONE_NOS ENDP
OUR_CODE ENDS
END PHONE_NOS